/**
 * 导出当前云数据库所有集合数据为 JSON 文件（文件名为集合名）
 * 运行方式：在 cloudfunctions/cloud 目录下执行：node ./database/export_all_collections.js
 * 如本地运行需提供腾讯云凭证，请在环境变量中设置：
 * - TCB_SECRET_ID / TCB_SECRET_KEY （或 SECRETID / SECRETKEY）
 * - 可选：TCB_SESSION_TOKEN（或 SESSIONTOKEN）
 */
const fs = require('fs');
const path = require('path');
const config = require('../config/config.js');

// 每次最大拉取数量（云函数端最大为1000）
const MAX_LIMIT = 1000;

function getCollections() {
  const raw = config.COLLECTION_NAME || '';
  return raw.split('|').map(s => s.trim()).filter(Boolean);
}

function initCloud() {
  const cloud = require('wx-server-sdk');
  const secretId = process.env.TCB_SECRET_ID || process.env.SECRETID || '';
  const secretKey = process.env.TCB_SECRET_KEY || process.env.SECRETKEY || '';
  const token = process.env.TCB_SESSION_TOKEN || process.env.SESSIONTOKEN || '';

  const initOptions = { env: config.CLOUD_ID };
  if (secretId && secretKey) {
    initOptions.credentials = { secretId, secretKey };
    if (token) initOptions.credentials.token = token;
    console.log('[INFO] 使用本地环境凭证初始化云环境');
  } else {
    console.log('[WARN] 未检测到本地凭证，将尝试使用默认初始化。如果失败，请设置环境变量 TCB_SECRET_ID/TCB_SECRET_KEY');
  }
  cloud.init(initOptions);
  return cloud;
}

async function fetchAllDocs(db, collectionName) {
  let all = [];
  let skip = 0;
  while (true) {
    const res = await db.collection(collectionName).skip(skip).limit(MAX_LIMIT).get();
    const list = res && res.data ? res.data : [];
    all.push(...list);
    if (list.length < MAX_LIMIT) break;
    skip += MAX_LIMIT;
  }
  return all;
}

async function exportCollection(db, collectionName, outDir) {
  try {
    const docs = await fetchAllDocs(db, collectionName);
    const filePath = path.join(outDir, `${collectionName}.json`);
    fs.writeFileSync(filePath, JSON.stringify(docs, null, 2), 'utf-8');
    console.log(`[OK] 导出完成: ${collectionName} -> ${filePath} (记录数: ${docs.length})`);
  } catch (err) {
    console.error(`[ERR] 导出失败: ${collectionName}`, err && err.message ? err.message : err);
  }
}

async function main() {
  const cloud = initCloud();
  const db = cloud.database();
  const collections = getCollections();
  const outDir = __dirname; // 保存到脚本所在目录

  console.log('开始导出集合：', collections.join(', '));

  for (const name of collections) {
    await exportCollection(db, name, outDir);
  }

  console.log('全部集合导出完成。');
}

main().catch(err => {
  console.error('导出脚本执行失败：', err);
  process.exit(1);
});